package rocks.inspectit.server.mail; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.hasEntry; import static org.hamcrest.Matchers.hasItems; import static org.hamcrest.Matchers.hasSize; import static org.hamcrest.Matchers.is; import static org.mockito.Matchers.any; import static org.mockito.Matchers.eq; import static org.mockito.Mockito.doThrow; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.verifyNoMoreInteractions; import static org.mockito.Mockito.verifyZeroInteractions; import static org.mockito.Mockito.when; import java.lang.reflect.Field; import java.util.Arrays; import java.util.List; import java.util.Properties; import java.util.concurrent.Future; import java.util.concurrent.ScheduledExecutorService; import javax.mail.AuthenticationFailedException; import javax.mail.MessagingException; import javax.mail.Session; import javax.mail.Transport; import org.apache.commons.mail.EmailException; import org.apache.commons.mail.HtmlEmail; import org.mockito.InjectMocks; import org.mockito.Mock; import org.mockito.invocation.InvocationOnMock; import org.mockito.stubbing.Answer; import org.slf4j.Logger; import org.testng.annotations.BeforeMethod; import org.testng.annotations.Test; import rocks.inspectit.server.mail.EMailSender.ObjectFactory; import rocks.inspectit.shared.all.externalservice.ExternalServiceStatus; import rocks.inspectit.shared.all.externalservice.ExternalServiceType; import rocks.inspectit.shared.all.testbase.TestBase; /** * Tests the {@link EMailSender} service. * * @author Alexander Wert * @author Marius Oehler * */ @SuppressWarnings("PMD") public class EMailSenderTest extends TestBase { @InjectMocks EMailSender mailSender; @Mock Logger log; @Mock ObjectFactory objectFactoryMock; @Mock ScheduledExecutorService scheduledExecutorService; Future<?> future; @BeforeMethod public void init() { future = mock(Future.class); when(scheduledExecutorService.submit(any(Runnable.class))).thenAnswer(new Answer<Future<?>>() { @Override public Future<?> answer(InvocationOnMock invocation) throws Throwable { Runnable runnabel = (Runnable) invocation.getArguments()[0]; runnabel.run(); return future; } }); } protected Properties getAdditionalProperties() throws Exception { Field field = EMailSender.class.getDeclaredField("additionalProperties"); field.setAccessible(true); return (Properties) field.get(mailSender); } @SuppressWarnings("unchecked") protected List<String> getDefaultRecipients() throws Exception { Field field = EMailSender.class.getDeclaredField("defaultRecipients"); field.setAccessible(true); return (List<String>) field.get(mailSender); } /** * Tests the {@link EMailSender#init()} method. * */ public static class Init extends EMailSenderTest { @Mock Transport transportMock; @Test public void successfully() throws Exception { when(objectFactoryMock.getSmtpTransport()).thenReturn(transportMock); mailSender.defaultRecipientString = "one@example.com,two@example.com,invalid"; mailSender.smtpPropertiesString = "key1=val1,key2=val2,=noKey,noVal=,=,invalid"; mailSender.smtpHost = "host"; mailSender.smtpPort = 25; mailSender.smtpUser = "user"; mailSender.smtpPassword = "passwd"; mailSender.smtpEnabled = true; mailSender.init(); verify(objectFactoryMock).getSmtpTransport(); verifyNoMoreInteractions(objectFactoryMock); verify(transportMock).connect("host", 25, "user", "passwd"); verify(transportMock).close(); verifyNoMoreInteractions(transportMock); assertThat(mailSender.isConnected(), is(true)); assertThat(getAdditionalProperties().entrySet(), hasSize(2)); assertThat(getAdditionalProperties(), hasEntry((Object) "key1", (Object) "val1")); assertThat(getAdditionalProperties(), hasEntry((Object) "key2", (Object) "val2")); assertThat(getDefaultRecipients(), hasSize(2)); assertThat(getDefaultRecipients(), hasItems("one@example.com", "two@example.com")); } @Test public void recipientsAndPopertiesAreNull() throws Exception { when(objectFactoryMock.getSmtpTransport()).thenReturn(transportMock); mailSender.defaultRecipientString = null; mailSender.smtpPropertiesString = null; mailSender.smtpHost = "host"; mailSender.smtpPort = 25; mailSender.smtpUser = "user"; mailSender.smtpPassword = "passwd"; mailSender.smtpEnabled = true; mailSender.init(); verify(objectFactoryMock).getSmtpTransport(); verify(transportMock).connect("host", 25, "user", "passwd"); verify(transportMock).close(); verifyNoMoreInteractions(objectFactoryMock, transportMock); assertThat(mailSender.isConnected(), is(true)); assertThat(getAdditionalProperties().entrySet(), hasSize(0)); assertThat(getDefaultRecipients(), hasSize(0)); } @Test public void authenticationFailes() throws Exception { when(objectFactoryMock.getSmtpTransport()).thenReturn(transportMock); doThrow(AuthenticationFailedException.class).when(transportMock).connect("host", 25, "user", "passwd"); mailSender.defaultRecipientString = null; mailSender.smtpPropertiesString = null; mailSender.smtpHost = "host"; mailSender.smtpPort = 25; mailSender.smtpUser = "user"; mailSender.smtpPassword = "passwd"; mailSender.smtpEnabled = true; mailSender.init(); verify(objectFactoryMock).getSmtpTransport(); verify(transportMock).connect("host", 25, "user", "passwd"); verifyNoMoreInteractions(objectFactoryMock, transportMock); assertThat(mailSender.isConnected(), is(false)); } @Test public void connectionToSmtpFailed() throws Exception { when(objectFactoryMock.getSmtpTransport()).thenReturn(transportMock); doThrow(MessagingException.class).when(transportMock).connect("host", 25, "user", "passwd"); mailSender.defaultRecipientString = null; mailSender.smtpPropertiesString = null; mailSender.smtpHost = "host"; mailSender.smtpPort = 25; mailSender.smtpUser = "user"; mailSender.smtpPassword = "passwd"; mailSender.smtpEnabled = true; mailSender.init(); verify(objectFactoryMock).getSmtpTransport(); verify(transportMock).connect("host", 25, "user", "passwd"); verifyNoMoreInteractions(objectFactoryMock, transportMock); assertThat(mailSender.isConnected(), is(false)); } } /** * Tests the {@link EMailSender#isConnected()} method. */ public static class IsConnected extends EMailSenderTest { @Mock Transport transportMock; @Test public void connected() throws MessagingException { when(objectFactoryMock.getSmtpTransport()).thenReturn(transportMock); mailSender.smtpEnabled = true; mailSender.init(); boolean result = mailSender.isConnected(); assertThat(result, is(true)); verify(objectFactoryMock).getSmtpTransport(); verify(transportMock).connect(any(String.class), any(Integer.class), any(String.class), any(String.class)); verify(transportMock).close(); verifyNoMoreInteractions(objectFactoryMock, transportMock); } @Test public void notConnected() throws MessagingException { when(objectFactoryMock.getSmtpTransport()).thenReturn(transportMock); doThrow(MessagingException.class).when(transportMock).connect(any(String.class), any(Integer.class), any(String.class), any(String.class)); mailSender.smtpEnabled = true; mailSender.init(); boolean result = mailSender.isConnected(); assertThat(result, is(false)); verify(objectFactoryMock).getSmtpTransport(); verify(transportMock).connect(any(String.class), any(Integer.class), any(String.class), any(String.class)); verifyNoMoreInteractions(objectFactoryMock, transportMock); } } /** * Tests the {@link EMailSender#getServiceStatus()} method. */ public static class GetServiceStatus extends EMailSenderTest { @Mock Transport transportMock; @Test public void connected() throws MessagingException { mailSender.smtpEnabled = true; when(objectFactoryMock.getSmtpTransport()).thenReturn(transportMock); mailSender.init(); ExternalServiceStatus result = mailSender.getServiceStatus(); assertThat(result, is(ExternalServiceStatus.CONNECTED)); verify(objectFactoryMock).getSmtpTransport(); verify(transportMock).connect(any(String.class), any(Integer.class), any(String.class), any(String.class)); verify(transportMock).close(); verifyNoMoreInteractions(objectFactoryMock, transportMock); } @Test public void notConnected() throws MessagingException { mailSender.smtpEnabled = true; when(objectFactoryMock.getSmtpTransport()).thenReturn(transportMock); doThrow(MessagingException.class).when(transportMock).connect(any(String.class), any(Integer.class), any(String.class), any(String.class)); mailSender.init(); ExternalServiceStatus result = mailSender.getServiceStatus(); assertThat(result, is(ExternalServiceStatus.DISCONNECTED)); verify(objectFactoryMock).getSmtpTransport(); verify(transportMock).connect(any(String.class), any(Integer.class), any(String.class), any(String.class)); verifyNoMoreInteractions(objectFactoryMock, transportMock); } @Test public void disabled() throws MessagingException { mailSender.smtpEnabled = false; mailSender.init(); ExternalServiceStatus result = mailSender.getServiceStatus(); assertThat(result, is(ExternalServiceStatus.DISABLED)); verifyZeroInteractions(objectFactoryMock, transportMock); } } /** * Tests the {@link EMailSender#sendEMail(String, String, String, java.util.List)} method. * * @author Alexander Wert * */ public static class SendEmail extends EMailSenderTest { @Mock HtmlEmail mailMock; @Mock Transport transportMock; @Test public void sendWithoutDefaultRecipientsAndProperties() throws Exception { Session session = Session.getInstance(new Properties()); when(mailMock.getMailSession()).thenReturn(session); when(objectFactoryMock.createHtmlEmail()).thenReturn(mailMock); when(objectFactoryMock.getSmtpTransport()).thenReturn(transportMock); mailSender.smtpHost = "host"; mailSender.smtpPort = 25; mailSender.smtpUser = "user"; mailSender.smtpPassword = "passwd"; mailSender.senderAddress = "sender@example.com"; mailSender.senderName = "Sender Name"; mailSender.smtpEnabled = true; mailSender.init(); boolean result = mailSender.sendEMail("subject", "htmlBody", "textBody", Arrays.asList("three@example.com")); assertThat(result, is(true)); verify(objectFactoryMock).getSmtpTransport(); verify(objectFactoryMock).createHtmlEmail(); verify(transportMock).connect(any(String.class), any(Integer.class), any(String.class), any(String.class)); verify(transportMock).close(); verify(mailMock).setHostName("host"); verify(mailMock).setSmtpPort(25); verify(mailMock).setAuthentication("user", "passwd"); verify(mailMock).setFrom("sender@example.com", "Sender Name"); verify(mailMock).addTo("three@example.com"); verify(mailMock).setSubject("subject"); verify(mailMock).setHtmlMsg("htmlBody"); verify(mailMock).setTextMsg("textBody"); verify(mailMock).send(); verifyNoMoreInteractions(objectFactoryMock, transportMock, mailMock); assertThat(session.getProperties().entrySet(), hasSize(0)); } @Test public void sendUsingDefaultRecipientsAndProperties() throws Exception { Session session = Session.getInstance(new Properties()); when(mailMock.getMailSession()).thenReturn(session); when(objectFactoryMock.createHtmlEmail()).thenReturn(mailMock); when(objectFactoryMock.getSmtpTransport()).thenReturn(transportMock); mailSender.defaultRecipientString = "one@example.com,two@example.com,invalid"; mailSender.smtpPropertiesString = "key1=val1,key2=val2,=noKey,noVal=,=,invalid"; mailSender.smtpHost = "host"; mailSender.smtpPort = 25; mailSender.smtpUser = "user"; mailSender.smtpPassword = "passwd"; mailSender.senderAddress = "sender@example.com"; mailSender.senderName = "Sender Name"; mailSender.smtpEnabled = true; mailSender.init(); boolean result = mailSender.sendEMail("subject", "htmlBody", "textBody", Arrays.asList("three@example.com")); assertThat(result, is(true)); assertThat(mailSender.getServiceStatus(), is(ExternalServiceStatus.CONNECTED)); assertThat(mailSender.getServiceType(), is(ExternalServiceType.MAIL_SENDER)); verify(objectFactoryMock).getSmtpTransport(); verify(objectFactoryMock).createHtmlEmail(); verify(transportMock).connect(any(String.class), any(Integer.class), any(String.class), any(String.class)); verify(transportMock).close(); verify(mailMock).setHostName("host"); verify(mailMock).setSmtpPort(25); verify(mailMock).setAuthentication("user", "passwd"); verify(mailMock).setFrom("sender@example.com", "Sender Name"); verify(mailMock).getMailSession(); verify(mailMock).addTo("one@example.com"); verify(mailMock).addTo("two@example.com"); verify(mailMock).addTo("three@example.com"); verify(mailMock).setSubject("subject"); verify(mailMock).setHtmlMsg("htmlBody"); verify(mailMock).setTextMsg("textBody"); verify(mailMock).send(); verifyNoMoreInteractions(objectFactoryMock, transportMock, mailMock); assertThat(session.getProperties().entrySet(), hasSize(2)); assertThat(session.getProperties(), hasEntry((Object) "key1", (Object) "val1")); assertThat(session.getProperties(), hasEntry((Object) "key2", (Object) "val2")); } @Test public void notConnected() throws Exception { mailSender.smtpEnabled = true; boolean result = mailSender.sendEMail("subject", "htmlBody", "textBody", Arrays.asList("one@example.com")); assertThat(result, is(false)); assertThat(mailSender.getServiceStatus(), is(ExternalServiceStatus.DISCONNECTED)); verifyZeroInteractions(mailMock); verifyZeroInteractions(transportMock); verifyZeroInteractions(objectFactoryMock); } @Test public void badSmtpPort() throws Exception { doThrow(IllegalArgumentException.class).when(mailMock).setSmtpPort(-1); when(objectFactoryMock.createHtmlEmail()).thenReturn(mailMock); when(objectFactoryMock.getSmtpTransport()).thenReturn(transportMock); mailSender.smtpHost = "host"; mailSender.smtpPort = -1; mailSender.smtpEnabled = true; mailSender.init(); boolean result = mailSender.sendEMail("subject", "htmlBody", "textBody", Arrays.asList("one@example.com")); assertThat(result, is(false)); verify(objectFactoryMock).getSmtpTransport(); verify(objectFactoryMock).createHtmlEmail(); verify(transportMock).connect(any(String.class), any(Integer.class), any(String.class), any(String.class)); verify(transportMock).close(); verify(mailMock).setHostName("host"); verify(mailMock).setSmtpPort(-1); verifyNoMoreInteractions(objectFactoryMock, transportMock, mailMock); } @Test public void badSenderAdress() throws Exception { when(objectFactoryMock.createHtmlEmail()).thenReturn(mailMock); when(objectFactoryMock.getSmtpTransport()).thenReturn(transportMock); doThrow(EmailException.class).when(mailMock).setFrom(eq("invalid"), any(String.class)); mailSender.defaultRecipientString = "one@example.com,two@example.com,invalid"; mailSender.smtpPropertiesString = "key1=val1,key2=val2,=noKey,noVal=,=,invalid"; mailSender.smtpHost = "host"; mailSender.smtpPort = 25; mailSender.smtpUser = "user"; mailSender.smtpPassword = "passwd"; mailSender.senderAddress = "invalid"; mailSender.senderName = "Sender Name"; mailSender.smtpEnabled = true; mailSender.init(); boolean result = mailSender.sendEMail("subject", "htmlBody", "textBody", Arrays.asList("three@example.com")); assertThat(result, is(false)); verify(objectFactoryMock).getSmtpTransport(); verify(objectFactoryMock).createHtmlEmail(); verify(transportMock).connect(any(String.class), any(Integer.class), any(String.class), any(String.class)); verify(transportMock).close(); verify(mailMock).setHostName("host"); verify(mailMock).setSmtpPort(25); verify(mailMock).setAuthentication("user", "passwd"); verify(mailMock).setFrom("invalid", "Sender Name"); verifyNoMoreInteractions(objectFactoryMock, transportMock, mailMock); } @Test(expectedExceptions = IllegalArgumentException.class) public void subjectIsNull() throws Exception { try { mailSender.smtpEnabled = true; mailSender.sendEMail(null, "htmlBody", "textBody", Arrays.asList("three@example.com")); } finally { verifyZeroInteractions(mailMock, transportMock, objectFactoryMock); } } @Test(expectedExceptions = IllegalArgumentException.class) public void htmlBodyIsNull() throws Exception { try { mailSender.smtpEnabled = true; mailSender.sendEMail("subject", null, "textBody", Arrays.asList("three@example.com")); } finally { verifyZeroInteractions(mailMock, transportMock, objectFactoryMock); } } @Test(expectedExceptions = IllegalArgumentException.class) public void textBodyIsNull() throws Exception { try { mailSender.smtpEnabled = true; mailSender.sendEMail("subject", "htmlBody", null, Arrays.asList("three@example.com")); } finally { verifyZeroInteractions(mailMock, transportMock, objectFactoryMock); } } @Test(expectedExceptions = IllegalArgumentException.class) public void subjectIsEmpty() throws Exception { try { mailSender.smtpEnabled = true; mailSender.sendEMail("", "htmlBody", "textBody", Arrays.asList("three@example.com")); } finally { verifyZeroInteractions(mailMock, transportMock, objectFactoryMock); } } @Test(expectedExceptions = IllegalArgumentException.class) public void htmlBodyIsEmpty() throws Exception { try { mailSender.smtpEnabled = true; mailSender.sendEMail("subject", "", "textBody", Arrays.asList("three@example.com")); } finally { verifyZeroInteractions(mailMock, transportMock, objectFactoryMock); } } @Test(expectedExceptions = IllegalArgumentException.class) public void textBodyIsEmpty() throws Exception { try { mailSender.smtpEnabled = true; mailSender.sendEMail("subject", "htmlBody", "", Arrays.asList("three@example.com")); } finally { verifyZeroInteractions(mailMock, transportMock, objectFactoryMock); } } } /** * Tests the {@link EMailSender#onSmtpPropertiesChanged()} method. * */ public class OnSmtpPropertiesChanged extends EMailSenderTest { @Mock HtmlEmail mailMock; @Mock Transport transportMock; @Test public void propertiesChanged() throws Exception { when(objectFactoryMock.getSmtpTransport()).thenReturn(transportMock); mailSender.defaultRecipientString = "one@example.com,two@example.com,invalid"; mailSender.smtpPropertiesString = "key1=val1,key2=val2,=noKey,noVal=,=,invalid"; mailSender.smtpHost = "host"; mailSender.smtpPort = 25; mailSender.smtpUser = "user"; mailSender.smtpPassword = "passwd"; mailSender.smtpEnabled = true; mailSender.onSmtpPropertiesChanged(); verify(objectFactoryMock).getSmtpTransport(); verify(transportMock).connect("host", 25, "user", "passwd"); verify(transportMock).close(); verifyNoMoreInteractions(mailMock, objectFactoryMock, transportMock); assertThat(mailSender.isConnected(), is(true)); assertThat(getAdditionalProperties().entrySet(), hasSize(2)); assertThat(getAdditionalProperties(), hasEntry((Object) "key1", (Object) "val1")); assertThat(getAdditionalProperties(), hasEntry((Object) "key2", (Object) "val2")); assertThat(getDefaultRecipients(), hasSize(0)); } @Test public void testMailFailedNoRecipient() throws Exception { when(objectFactoryMock.getSmtpTransport()).thenReturn(transportMock); mailSender.smtpHost = "host"; mailSender.smtpPort = 25; mailSender.smtpUser = "user"; mailSender.smtpPassword = "passwd"; mailSender.testMailEnabled = true; mailSender.smtpEnabled = true; mailSender.onSmtpPropertiesChanged(); verify(objectFactoryMock).getSmtpTransport(); verify(transportMock).connect("host", 25, "user", "passwd"); verify(transportMock).close(); verifyNoMoreInteractions(mailMock, objectFactoryMock, transportMock); assertThat(mailSender.isConnected(), is(true)); assertThat(getAdditionalProperties().entrySet(), hasSize(0)); assertThat(getDefaultRecipients(), hasSize(0)); } @Test public void testMailFailedNoConnection() throws Exception { when(objectFactoryMock.getSmtpTransport()).thenReturn(transportMock); doThrow(MessagingException.class).when(transportMock).connect("host", 25, "user", "passwd"); mailSender.smtpHost = "host"; mailSender.smtpPort = 25; mailSender.smtpUser = "user"; mailSender.smtpPassword = "passwd"; mailSender.testMailEnabled = true; mailSender.testMailRecipient = "@test@example.com"; mailSender.smtpEnabled = true; mailSender.onSmtpPropertiesChanged(); verify(objectFactoryMock).getSmtpTransport(); verify(transportMock).connect("host", 25, "user", "passwd"); verifyNoMoreInteractions(mailMock, objectFactoryMock, transportMock); assertThat(mailSender.isConnected(), is(false)); assertThat(getAdditionalProperties().entrySet(), hasSize(0)); assertThat(getDefaultRecipients(), hasSize(0)); } @Test public void testMailFailedInvalidRecipient() throws Exception { when(objectFactoryMock.getSmtpTransport()).thenReturn(transportMock); mailSender.defaultRecipientString = "one@example.com,two@example.com,invalid"; mailSender.smtpPropertiesString = "key1=val1,key2=val2,=noKey,noVal=,=,invalid"; mailSender.smtpHost = "host"; mailSender.smtpPort = 25; mailSender.smtpUser = "user"; mailSender.smtpPassword = "passwd"; mailSender.testMailEnabled = true; mailSender.testMailRecipient = "@test@example.com"; mailSender.smtpEnabled = true; mailSender.onSmtpPropertiesChanged(); verify(objectFactoryMock).getSmtpTransport(); verify(transportMock).connect("host", 25, "user", "passwd"); verify(transportMock).close(); verifyNoMoreInteractions(mailMock, objectFactoryMock, transportMock); assertThat(mailSender.isConnected(), is(true)); assertThat(getAdditionalProperties().entrySet(), hasSize(2)); assertThat(getAdditionalProperties(), hasEntry((Object) "key1", (Object) "val1")); assertThat(getAdditionalProperties(), hasEntry((Object) "key2", (Object) "val2")); assertThat(getDefaultRecipients(), hasSize(0)); } @Test @SuppressWarnings("unchecked") public void testMailThrowsException() throws Exception { when(objectFactoryMock.getSmtpTransport()).thenReturn(transportMock); when(objectFactoryMock.createHtmlEmail()).thenReturn(mailMock); when(mailMock.setTextMsg(any(String.class))).thenThrow(EmailException.class); mailSender.smtpHost = "host"; mailSender.smtpPort = 25; mailSender.smtpUser = "user"; mailSender.smtpPassword = "passwd"; mailSender.senderAddress = "sender@example.com"; mailSender.senderName = "Sender Name"; mailSender.testMailEnabled = true; mailSender.testMailRecipient = "test@example.com"; mailSender.smtpEnabled = true; mailSender.onSmtpPropertiesChanged(); verify(objectFactoryMock).getSmtpTransport(); verify(objectFactoryMock).createHtmlEmail(); verify(transportMock).connect("host", 25, "user", "passwd"); verify(transportMock).close(); verify(mailMock).setHostName("host"); verify(mailMock).setSmtpPort(25); verify(mailMock).setAuthentication("user", "passwd"); verify(mailMock).setFrom("sender@example.com", "Sender Name"); verify(mailMock).addTo("test@example.com"); verify(mailMock).setSubject(any(String.class)); verify(mailMock).setTextMsg(any(String.class)); verifyNoMoreInteractions(mailMock, objectFactoryMock, transportMock); assertThat(mailSender.isConnected(), is(true)); assertThat(getAdditionalProperties().entrySet(), hasSize(0)); assertThat(getDefaultRecipients(), hasSize(0)); } @Test public void sendTestMail() throws Exception { when(objectFactoryMock.getSmtpTransport()).thenReturn(transportMock); when(objectFactoryMock.createHtmlEmail()).thenReturn(mailMock); mailSender.smtpHost = "host"; mailSender.smtpPort = 25; mailSender.smtpUser = "user"; mailSender.smtpPassword = "passwd"; mailSender.senderAddress = "sender@example.com"; mailSender.senderName = "Sender Name"; mailSender.testMailEnabled = true; mailSender.testMailRecipient = "test@example.com"; mailSender.smtpEnabled = true; mailSender.onSmtpPropertiesChanged(); verify(objectFactoryMock).getSmtpTransport(); verify(objectFactoryMock).createHtmlEmail(); verify(transportMock).connect("host", 25, "user", "passwd"); verify(transportMock).close(); verify(mailMock).setHostName("host"); verify(mailMock).setSmtpPort(25); verify(mailMock).setAuthentication("user", "passwd"); verify(mailMock).setFrom("sender@example.com", "Sender Name"); verify(mailMock).addTo("test@example.com"); verify(mailMock).setSubject(any(String.class)); verify(mailMock).setTextMsg(any(String.class)); verify(mailMock).send(); verifyNoMoreInteractions(mailMock, objectFactoryMock, transportMock); assertThat(mailSender.isConnected(), is(true)); assertThat(getAdditionalProperties().entrySet(), hasSize(0)); assertThat(getDefaultRecipients(), hasSize(0)); } } }